package com.xqb.modules.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.xqb.common.constant.Constants;
import com.xqb.common.utils.DateUtils;
import com.xqb.common.utils.SecurityUtils;
import com.xqb.modules.domain.dto.MktUserCouponDto;
import com.xqb.modules.domain.po.MktCoupon;
import com.xqb.modules.domain.po.MktCouponScope;
import com.xqb.modules.domain.po.MktUserCoupon;
import com.xqb.modules.mapper.MktCouponMapper;
import com.xqb.modules.mapper.MktCouponScopeMapper;
import com.xqb.modules.mapper.MktUserCouponMapper;
import com.xqb.modules.service.IMktUserCouponService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.*;
import java.util.stream.Collectors;

/**
 * 领取优惠券的记录Service业务层处理
 *
 * @author xqb
 * @date 2024-10-15
 */
@Service
public class MktUserCouponServiceImpl implements IMktUserCouponService {
    @Autowired
    private MktUserCouponMapper mktUserCouponMapper;
    @Autowired
    private MktCouponMapper mktCouponMapper;
    @Autowired
    private MktCouponScopeMapper mktCouponScopeMapper;

    /**
     * 查询领取优惠券的记录
     *
     * @param id 领取优惠券的记录主键
     * @return 领取优惠券的记录
     */
    @Override
    public MktUserCoupon selectMktUserCouponById(Long id) {
        return mktUserCouponMapper.selectMktUserCouponById(id);
    }

    /**
     * 查询领取优惠券的记录列表
     *
     * @param mktUserCoupon 领取优惠券的记录
     * @return 领取优惠券的记录
     */
    @Override
    public List<MktUserCoupon> selectMktUserCouponList(MktUserCoupon mktUserCoupon) {
        return mktUserCouponMapper.selectMktUserCouponList(mktUserCoupon);
    }

    /**
     * 新增领取优惠券的记录
     *
     * @param mktUserCoupon 领取优惠券的记录
     * @return 结果
     */
    @Override
    public int insertMktUserCoupon(MktUserCoupon mktUserCoupon) {
        mktUserCoupon.setCreateTime(DateUtils.getNowDate());
        return mktUserCouponMapper.insertMktUserCoupon(mktUserCoupon);
    }

    /**
     * 修改领取优惠券的记录
     *
     * @param mktUserCoupon 领取优惠券的记录
     * @return 结果
     */
    @Override
    public int updateMktUserCoupon(MktUserCoupon mktUserCoupon) {
        mktUserCoupon.setUpdateTime(DateUtils.getNowDate());
        return mktUserCouponMapper.updateMktUserCoupon(mktUserCoupon);
    }

    /**
     * 批量删除领取优惠券的记录
     *
     * @param ids 需要删除的领取优惠券的记录主键
     * @return 结果
     */
    @Override
    public int deleteMktUserCouponByIds(Long[] ids) {
        return mktUserCouponMapper.deleteMktUserCouponByIds(ids);
    }

    /**
     * 删除领取优惠券的记录信息
     *
     * @param id 领取优惠券的记录主键
     * @return 结果
     */
    @Override
    public int deleteMktUserCouponById(Long id) {
        return mktUserCouponMapper.deleteMktUserCouponById(id);
    }

    /**
     * 获取用户可以使用的优惠券列表
     *
     * @param mktCoupon 用户优惠券信息对象
     * @return 用户可以使用的优惠券列表
     */
    @Override
    public List<MktCoupon> getUseCouponList(MktUserCouponDto mktCoupon) {
        if (mktCoupon.getUserId() == null) {
            mktCoupon.setUserId(SecurityUtils.getUserId());
        }
        LambdaQueryWrapper<MktUserCoupon> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(MktUserCoupon::getUserId, mktCoupon.getUserId())
                .eq(MktUserCoupon::getStatus, Constants.COUPON_NO_USE);
        List<MktUserCoupon> mktUserCoupons = mktUserCouponMapper.selectList(queryWrapper);
        List<Long> couponIds = mktUserCoupons.stream()
                .map(MktUserCoupon::getCouponId)
                .collect(Collectors.toList());
        // 过滤优惠券范围
        filterCouponScopes(mktCoupon, couponIds);
        // 过滤满减金额大于课程价格的优惠券
        filterDiscountCoupons(mktCoupon, couponIds);
        if (couponIds.isEmpty()) {
            return Collections.emptyList();
        }
        return mktCouponMapper.selectList(new LambdaQueryWrapper<MktCoupon>().in(MktCoupon::getId, couponIds));
    }

    /**
     * 过滤优惠券范围
     *
     * @param mktCoupon 用户优惠券信息对象
     * @param couponIds 优惠券ID列表
     */
    private void filterCouponScopes(MktUserCouponDto mktCoupon, List<Long> couponIds) {
        if (couponIds.isEmpty()) {
            return;
        }
        List<MktCouponScope> mktCouponScopes = mktCouponScopeMapper.selectList(new LambdaQueryWrapper<MktCouponScope>().in(MktCouponScope::getCouponId, couponIds));
        Map<Long, List<MktCouponScope>> map = mktCouponScopes.stream()
                .collect(Collectors.groupingBy(MktCouponScope::getBizId));
        // 过滤课程、机构、分类优惠券范围
        map.forEach((bizId, scopes) -> {
            for (MktCouponScope scope : scopes) {
                if (bizId.equals(Constants.COUPON_SCOPE_COURSE) && !mktCoupon.getCourseId().equals(scope.getBizId())) {
                    couponIds.remove(scope.getCouponId());
                } else if (bizId.equals(Constants.COUPON_SCOPE_INSTITUTION) && !mktCoupon.getInsId().equals(scope.getBizId())) {
                    couponIds.remove(scope.getCouponId());
                } else if (bizId.equals(Constants.COUPON_SCOPE_CLASSIFICATION) &&
                        (!mktCoupon.getFirstCateId().equals(scope.getBizId()) &&
                                !mktCoupon.getSecondCateId().equals(scope.getBizId()) &&
                                !mktCoupon.getThirdCateId().equals(scope.getBizId()))) {
                    couponIds.remove(scope.getCouponId());
                }
            }
        });
    }

    /**
     * 过滤满减金额大于课程价格的优惠券
     *
     * @param mktCoupon 用户优惠券信息对象
     * @param couponIds 优惠券ID列表
     */
    private void filterDiscountCoupons(MktUserCouponDto mktCoupon, List<Long> couponIds) {
        if (couponIds.isEmpty()) {
            return;
        }
        List<MktCoupon> mktCouponList = mktCouponMapper.selectList(new LambdaQueryWrapper<MktCoupon>().in(MktCoupon::getId, couponIds));
        // 使用迭代器和临时集合来避免直接在遍历中修改原集合
        Iterator<MktCoupon> iterator = mktCouponList.iterator();
        List<Long> toRemoveIds = new ArrayList<>();
        while (iterator.hasNext()) {
            MktCoupon mktCoupon1 = iterator.next();
            if ((mktCoupon1.getDiscountType().equals(Constants.COUPON_TYPE_DISCOUNT) ||
                    mktCoupon1.getDiscountType().equals(Constants.COUPON_TYPE_MINUS))) {
                if (mktCoupon1.getDiscountValue() > mktCoupon.getPrice()) {
                    toRemoveIds.add(mktCoupon1.getId());
                }
            }
            if (mktCoupon1.getThresholdAmount() > mktCoupon.getPrice()) {
                toRemoveIds.add(mktCoupon1.getId());
            }

        }
        // 在遍历结束后，统一从原集合中移除不满足条件的优惠券ID
        couponIds.removeAll(toRemoveIds);
    }
}
